iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
AI Security

我做了一個Claude skill的掃毒軟體學到的那些事系列 第 9

# 為什麼自己測 100 分的防禦,一丟到外部真實資料集只剩 13 分?

  • 分享至 

  • xImage
  •  

我們的小章魚 SDK 爆掉了。

小章魚是一套防禦 prompt injection 的工具。prompt injection 是指把惡意指令偽裝成一般訊息,騙 AI 照做的攻擊。這次我只測試第一層 Input Guard(輸入守門員,訊息進到 AI 之前的第一道檢查)。

從 100 分到 13 分

我的測試順序是這樣的:

  1. 先跑用 Claude 打造的內部測試集,Recall 1.0,所有攻擊都抓到,等於 100 分。
  2. 覺得可以了,去 Hugging Face 找公開資料集做第一次外部驗證:deepset/prompt-injections。這份資料集總共 662 筆(訓練集 546 筆、測試集 116 筆),其中 263 筆是攻擊,其餘 399 筆是正常訊息。
  3. 跑 Benchmark(一套公開、標準化的考卷與計分標準)。

結果馬上爆掉:Recall(召回率)0.13、Precision(精確率)0.97、F1(綜合成績)0.22。

這三個數字是什麼意思?

Recall(召回率):抓到惡意攻擊的能力。

Recall = 抓到的惡意攻擊數 ÷ 所有惡意攻擊總數

0.13 代表 263 筆攻擊裡,我只抓到大約 34 筆,剩下 87% 全部放行。⚠️ Recall 太低,就是非常嚴重的漏報。

Precision(精確率):被攔下來的訊息裡,有多少真的是攻擊。

Precision = 真的是惡意攻擊的數量 ÷ 被攔下的總數

0.97 代表我攔下的幾乎都是真的攻擊,很少誤傷正常訊息。

兩個數字合起來看:我的防禦一旦出手,幾乎都是對的,但它出手的次數太少了。大部分攻擊,它根本沒認出來。

F1:把 Recall 和 Precision 平衡後的綜合成績。

F1 = 2 × (Precision × Recall) ÷ (Precision + Recall)

算出來 0.22,相當於總分 22 分。

為什麼內部測試會騙人?

回頭看,內部的 100 分不是假的,只是那份考卷是我自己出的。測試題是 Claude 寫的,防禦規則也是 Claude 寫的,等於同一個腦袋出題、同一個腦袋作答。規則認得的句型,剛好就是測試題會出現的句型,分數當然漂亮。⚠️

外部資料集是別人出的題,攻擊的寫法、語言、手法都不在我的預期裡,真正的程度就露出來了。

我怎麼除錯:一本錯題本

我用的流程很像準備模擬考:

  1. 跑 benchmark,拿到 Recall / Precision / F1。 就像先考一次模擬考,知道自己幾分。
  2. 開一個檔案,把所有漏報(該抓沒抓)和誤報(不該抓卻抓了)的樣本分類,先分語言,再分攻擊類型和手段。 就像整理錯題本,把錯的題目依照科目和題型歸類。
  3. 從漏洞最大的類別開始,當作下一個 Patch(漏洞修補)的目標。 就像從錯最多的題型先補,並設定這個題型的目標分數。
  4. 修改 Regex(正則表達式,用固定句型比對文字,例如看到「忽略前面的指令」就攔下來),並把舊版備份成 .bakN(N 是第幾版,改壞了可以退回)。 就像寫新的練習題,同時保留舊考卷方便比較。
  5. 重跑 benchmark,看數字動了多少。 就像再考一次,看分數變化。

我的習慣是一次只改一個變因,patch 盡量小。這樣分數動了,我才知道是哪一個修改造成的。

新的問題:我是不是又在背答案?

改到一半,我發現一件事:我一直拿同一份考卷重考。分數上升,可能只是我把這份考卷的答案背起來了,而不是防禦真的變強。

這跟內部測試拿 100 分,其實是同一個錯誤。我差點再犯一次。

下一篇,我會打開錯題本:漏掉的那 87% 攻擊到底長什麼樣子,以及我怎麼避免再背一次答案。


上一篇
我是怎麼防禦提示詞注入?
下一篇
我防禦規則最大的漏洞到底在哪裡?
系列文
我做了一個Claude skill的掃毒軟體學到的那些事10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言